#include "stm32f10x.h"

// 初始化通用定时器2
void Timer_Init(void) {

    // RCC内部时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    // 外部源的引脚(PA0)
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    // 文档推荐使用浮空输入
    // （如果外部的输入信号功率很小，内部的上拉电阻可能会影响输入信号时，使用浮空输入）
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 时钟源(默认也是内部时钟)
    // TIM_InternalClockConfig(TIM2);
    // 外部源(分频，极性，滤波)
    TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);

    // 时基单元（PSC预分频器，CNT计数器，ARR自动重装器）
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 不分频
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
    // 计数器溢出频率 
    // CK_CNT_OV = CK_CNT/(ARR+1) = CK_PSC/(PSC+1)/(ARR+1)
    // CK_CNT 为 72MHz
    TIM_TimeBaseStructure.TIM_Period = 10 - 1; // 自动重装器（此处使用 proteus 测试时应该为 11 - 1 ）
    TIM_TimeBaseStructure.TIM_Prescaler = 1 - 1; // 预分频器
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; // 重复计数器
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

    // 清除更新中断标志位，防止复位后马上就进入一次中断
    // TIM_ClearFlag(TIM2, TIM_FLAG_Update);

    // 中断输出控制(使能中断)
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

    // NVIC配置优先级
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    // 运行控制（使能计数器）
    TIM_Cmd(TIM2, ENABLE);
}

uint16_t Timer_GetCounter(void) {
    return TIM_GetCounter(TIM2);
}

// void TIM2_IRQHandler(void) {
//     if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) {
//         TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
//         // 定时器中断处理
//     }
// }
